package com.stu.reflection.handle_pojo;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
// 工具类
public class ClassInstanceFactory{
	private ClassInstanceFactory() {}
	/**
	 * 创建实例化对象
	 * @param <T>
	 * @param clazz 要进行反射实例化的的Class对象
	 * @param value 属性内容：格式为：“属性:内容|属性:内容”
	 * @return 1个配置好属性的实例化对象
	 */
	public static <T> T createInstance(Class<T> clazz,String value) {
		try {
			T obj = clazz.getDeclaredConstructor().newInstance();
			BeanUtils.setValue(obj, value);
			return obj;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
class BeanUtils{
	private BeanUtils() {}
	//为对象obj的属性赋值
	public static void setValue(Object obj,String value) {
		String[] values = value.split("\\|");
		for(int x=0;x<values.length;x++) {
			String[] nameAndValue = values[x].split(":");
			try {
				if(nameAndValue[0].contains(".")) {//存在级联关系（处理2级级联）
					String[] ralations = nameAndValue[0].split("\\.");
					Object currentObject = obj;
					//最后1位是指定类中的属性名称，所以不再本次实例化处理的范围内
					for(int y=0;y<ralations.length-1;y++) {
						//调用相应的getter方法，如果getter方法返回了null表示该对象未实例化
						Method getter = obj.getClass().getDeclaredMethod("get"+StringUtils.initcap(ralations[y]));
						Object ralaObject = getter.invoke(currentObject);
						if(ralaObject==null) {//该对象现在并没有实例化
							Field field = currentObject.getClass().getDeclaredField(ralations[y]);
							Method method = currentObject.getClass().getDeclaredMethod("set"+StringUtils.initcap(ralations[y]), field.getType());
							Object newObject = field.getType().getDeclaredConstructor().newInstance();
							method.invoke(currentObject, newObject);
							currentObject = newObject;
						}else {
							currentObject = ralaObject;
						}
					}
					//设置属性内容
					Field field = currentObject.getClass().getDeclaredField(ralations[ralations.length-1]);
					Method setter = currentObject.getClass().getDeclaredMethod("set"+StringUtils.initcap(ralations[ralations.length-1]), field.getType());
					Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(), nameAndValue[1]);
					setter.invoke(currentObject, convertValue);
				}else {
					Field field = obj.getClass().getDeclaredField(nameAndValue[0]);
					Method setter = obj.getClass().getDeclaredMethod("set"+StringUtils.initcap(nameAndValue[0]), field.getType());
					Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(), nameAndValue[1]);
					setter.invoke(obj, convertValue);
				}
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * @param type 属性类型
	 * @param value 属性值
	 * @return 指定属性类型的属性值
	 */
	private static Object convertAttributeValue(String type,String value) {
		if("long".equals(type)||"java.lang.Long".equals(type)) {
			return Long.parseLong(value);
		}else if("int".equals(type)||"java.lang.Integer".equals(type)) {
			return Integer.parseInt(value);
		}else if("double".equals(type)||"java.lang.Double".equals(type)) {
			return Double.parseDouble(value);
		}else if("java.util.Date".equals(type)) {
			SimpleDateFormat sdf = null;
			if(value.matches("\\d{4}-\\d{2}-\\d{2}")) {
				sdf = new SimpleDateFormat("yyyy-MM-dd");
			}else if(value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
				sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			}else {
				return new Date();
			}
			try {
				return sdf.parse(value);
			} catch (ParseException e) {
				return new Date();
			}
		}else {
			return value;
		}
	}
}
class StringUtils{
	//首字母大写
	public static String initcap(String str) {
		if(str==null||"".equals(str)) return str;
		return str.length()==1 ? str.toUpperCase() : str.substring(0, 1).toUpperCase()+str.substring(1);
	}
}